package 疯狂Java讲义.第15章_输入输出._15_7_RandomAccessFile;

import java.io.*;

public class InsertContent {
    public static void insert(String FileName, long pos, String insertContent) throws IOException{
        // 创建一个临时文件，不指定后缀的话，默认为.tmp后缀
        var tmp = File.createTempFile("Chapter_15_7_temp", null);
        // 然后用退出时删除钩子来删除该临时文件
        tmp.deleteOnExit();

        try (
                var raf = new RandomAccessFile(FileName, "rw");
                // 使用临时文件来保存插入点后的数据
                var tmpOut = new FileOutputStream(tmp);
                var tmpIn = new FileInputStream(tmp)
                ){
            // 先将文件记录指针移动到指定的位置
            raf.seek(pos);
            // -----下面的代码将插入点后的内容读入临时文件中保存-----
            var bbuf = new byte[64];
            var hasRead = 0;
            while ((hasRead = raf.read(bbuf)) > 0){
                tmpOut.write(bbuf, 0, hasRead);
            }

            // -----下面的代码用于插入内容-----
            // 首先要将文件记录指针置回原来要插入的地方
            raf.seek(pos);
            raf.write(insertContent.getBytes());

            // 然后从临时文件中读取数据，将原文内容追加到插入内容之后
            while ((hasRead = tmpIn.read(bbuf)) > 0 ){
                raf.write(bbuf, 0, hasRead);
            }
        }
    }

    public static void main(String[] args) throws IOException {
        String path = "./src/" + InsertContent.class.getName().replace(".", "/") + ".java";
        insert(path, 40, "插入的内容");
    }
}
